package com.axxc.cloud.utils;

import org.apache.commons.lang3.StringUtils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 
 * @ClassName: PinYinUtils
 * @Description: 汉字转拼音工具类
 * @author xxc
 * @date 2018年8月10日 下午3:12:40
 * @see https://blog.csdn.net/qq_32258777/article/details/81030662
 */

public final class PinYinUtils {

	private PinYinUtils() {
	}

	/**
	 * 转为大写字母, 如：中国人民银行 =====>ZHONGGUORENMINYINHAN
	 * 
	 */
	public static String toLongSpellUppercase(String text) {
		return convert(text, HanyuPinyinCaseType.UPPERCASE, false);
	}

	/**
	 * 转为小写字母, 如：中国人民银行 =====>zhongguorenminyinhang
	 * 
	 */
	public static String toLongSpellLowercase(String text) {
		return convert(text, HanyuPinyinCaseType.LOWERCASE, false);
	}

	/**
	 * 首字母大写, 如：中国人民银行 =====>ZhongGuoRenMinYinHang
	 * 
	 */
	public static String toFirstWordUppercase(String text) {
		return convert(text, null, true);
	}

	/**
	 * 所有中文的第一个字母大写, 如：中国人民银行 =====>ZGRMYH
	 * 
	 */
	public static String toShortSpellUppercase(String text) {
		String c = toFirstWordUppercase(text);
		if (StringUtils.isBlank(c)) {
			return "";
		}

		return StringUtils.replacePattern(c, "[a-z]", "");
	}

	/**
	 * 所有中文的第一个字母小写, 如：中国人民银行 =====>zgrmyh
	 * 
	 */
	public static String toShortSpellLowercase(String text) {
		String c = toFirstWordUppercase(text);
		if (StringUtils.isBlank(c)) {
			return "";
		}

		return StringUtils.replacePattern(c, "[a-z]", "").toLowerCase();// 将小写替换为空,再转为小写
	}

	/**
	 * 转为拼音
	 * 
	 * @param text         待转化的中文字符
	 * @param caseType     转化类型, 即大写小写
	 * @param isCapitalize 是否首字母大写
	 * @author lance 2016年1月17日 下午10:28:05
	 */
	public static String convert(String text, HanyuPinyinCaseType caseType, boolean isCapitalize) {
		if (StringUtils.isBlank(text)) {
			return "";
		}
		HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
		if (caseType != null) {
			format.setCaseType(caseType);
			isCapitalize = false;
		}

		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		format.setVCharType(HanyuPinyinVCharType.WITH_V);
		char[] input = StringUtils.trimToEmpty(text).toCharArray();
		StringBuilder builder = new StringBuilder();
		try {
			for (char c : input) {
				if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(c, format);
					if (isCapitalize) {
						builder.append(StringUtils.capitalize(temp[0]));
					} else {
						builder.append(temp[0]);
					}
				} else {
					if (isCapitalize) {
						builder.append(StringUtils.capitalize(Character.toString(c)));
					} else {
						builder.append(Character.toString(c));
					}
				}
			}
		} catch (BadHanyuPinyinOutputFormatCombination ex) {
			ex.printStackTrace();
		}

		return builder.toString();
	}

	public static void main(String[] args) {

		System.out.println(toShortSpellUppercase("中国人民银行"));
	}

}